SPI.c

					
/*
 * SPI_functions.c
 *
 *  Created on: 26 mai 2018.
 *      Author: Bohdan
 */

#include "My_types.h"
#include "SPI_functions.h"
#include "PIN_functions.h"
#include "stm32f4xx_hal.h"
#include "spi.h"

/* The function of reading the temperature data from the sensor on the SPI
 * Parameters:
 *		sensor_pair - pair of current sensors who are polling
 *		Temp_arr - array for storing the temperature
 */
void get_temp_value (uint32_t* Temp_arr)//temp_sens_t* sensor_pair, uint32_t* Temp_arr)
{
	// Адреси регістрів з даними про температуру (LSB->MSB)
	uint8_t byte_addr = 0x0C;
	uint8_t byte_rec_1[3] = {0};
	uint8_t byte_rec_2[3] = {0};

	for(temp_sens_t i = TEMP_SENS_1; i <= TEMP_SENS_12; i++)
	{
		chip_sel_temp_sens(i, ON);

		HAL_SPI_Transmit(&hspi1, &byte_addr, 1, 0xFFFF);
		HAL_SPI_Transmit(&hspi3, &byte_addr, 1, 0xFFFF);

		HAL_SPI_Receive(&hspi1, &byte_rec_1[2], 1, 0xFFFF);
		HAL_SPI_Receive(&hspi3, &byte_rec_2[2], 1, 0xFFFF);

		HAL_SPI_Receive(&hspi1, &byte_rec_1[1], 1, 0xFFFF);
		HAL_SPI_Receive(&hspi3, &byte_rec_2[1], 1, 0xFFFF);

		HAL_SPI_Receive(&hspi1, &byte_rec_1[0], 1, 0xFFFF);
		HAL_SPI_Receive(&hspi3, &byte_rec_2[0], 1, 0xFFFF);

		chip_sel_temp_sens(i, OFF);

		// Формирование массивов со значениями температуры
		Temp_arr[i] = (int32_t)byte_rec_1[2] << 16;
		Temp_arr[i] |= (uint32_t)byte_rec_1[1] << 8;
		Temp_arr[i] |= (uint32_t)byte_rec_1[0];

		Temp_arr[i+12] = (int32_t)byte_rec_2[2] << 16;
		Temp_arr[i+12] |= (uint32_t)byte_rec_2[1] << 8;
		Temp_arr[i+12] |= (uint32_t)byte_rec_2[0];
	}
}

/* Function for adjustment the temperature sensors
 * Parameters:
 * 		CR0_content - content for register CR0 of temperature sensor
 * 		CR1_content - content for register CR1 of temperature sensor
 * 		TS_enum - pointer to array with enumeration of temperature sensors
 * 		Type - type of thermocouple
 */
void Set_sensors(uint8_t CR0_content, uint8_t CR1_content, TC_type_t* Type) // temp_sens_t* TS_enum, TC_type_t* Type)
{
	uint8_t CR0_addr = 0x80;

	for(temp_sens_t i = TEMP_SENS_1; i <= TEMP_SENS_12; i++)
	{
		uint8_t CR1_cont_1 = CR1_content;
		uint8_t CR1_cont_2 = CR1_content;
		chip_sel_temp_sens(i, ON);

		HAL_SPI_Transmit(&hspi1, &CR0_addr, 1, 0xFFFF);
		HAL_SPI_Transmit(&hspi3, &CR0_addr, 1, 0xFFFF);

		HAL_SPI_Transmit(&hspi1, &CR0_content, 1, 0xFFFF);
		HAL_SPI_Transmit(&hspi3, &CR0_content, 1, 0xFFFF);

		CR1_cont_1 |= (uint8_t)Type[i];
		CR1_cont_2 |= (uint8_t)Type[i];

		HAL_SPI_Transmit(&hspi1, &CR1_cont_1, 1, 0xFFFF);
		HAL_SPI_Transmit(&hspi3, &CR1_cont_2, 1, 0xFFFF);

		chip_sel_temp_sens(i, OFF);
	}
}

void Set_1_sensor(uint8_t CR0_content, uint8_t CR1_content, TC_type_t Type, uint8_t channel)
{
	SPI_HandleTypeDef* spi;
	if(channel < 12)
		spi = &hspi1;
	else
		spi = &hspi3;

	uint8_t CR0_addr = 0x80;
	uint8_t CR1_cont = CR1_content;

	chip_sel_temp_sens(channel, ON);

	HAL_SPI_Transmit(spi, &CR0_addr, 1, 0xFFFF);

	HAL_SPI_Transmit(spi, &CR0_content, 1, 0xFFFF);

	CR1_cont |= (uint8_t)Type;

	HAL_SPI_Transmit(spi, &CR1_cont, 1, 0xFFFF);

	chip_sel_temp_sens(channel, OFF);
}

/* Function for getting values of fault registers in data sensors
 * Parameters:
 * 		 sensor_pair - number of sensor pair (data sensors: sensor_pair & sensor_pair+12)
 * 		 Buff - pointer to array, for data to be stored
 */
void get_fault_regs (uint8_t* Buff) //temp_sens_t* sensor_pair, uint8_t* Buff)
{
	// Addresses of registers with temperature data (LSB->MSB)
	uint8_t fault_addr = 0x0F;

	for(temp_sens_t i = TEMP_SENS_1; i <= TEMP_SENS_12; i++)
	{
		chip_sel_temp_sens(i, ON);

		HAL_SPI_Transmit(&hspi1, &fault_addr, 1, 0xFFFF);
		HAL_SPI_Transmit(&hspi3, &fault_addr, 1, 0xFFFF);

		HAL_SPI_Receive(&hspi1, &Buff[i], 1, 0xFFFF);
		HAL_SPI_Receive(&hspi3, &Buff[i+12], 1, 0xFFFF);

		chip_sel_temp_sens(i, OFF);
	}
}